﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation.BusinessRules;
using Sinacor.Infra.Common.Validation;

namespace Sinacor.Servico.Bovespa.Corretagem.BusinessLogic.BusinessRuleValidation {

    /// <summary>
	/// Validador de inclusão de politica de corretagem
	/// </summary>
    public class ValidaInclusaoPoliticaCorretagem : BaseBusinessRuleValidation<BusinessEntity.PoliticaCorretagem>, IBusinessRuleValidation
    {
		#region Atributos 

		private int _erroObjetoNulo = 109559;
		private int _politicaExistente = 109560; 

		#endregion

		#region Propriedades 

        /// <summary>
        /// Política Existente
        /// </summary>
		public int PoliticaExistente{
			get
			{
				return _politicaExistente;
			}
			set
			{
				_politicaExistente = value;
			}
		}

        /// <summary>
        /// Objeto Nulo
        /// </summary>
		public int ErroObjetoNulo{
			get
			{
				return _erroObjetoNulo;
			}
			set
			{
				_erroObjetoNulo = value;
			}
		} 

		#endregion

		#region Construtor

        /// <summary>
        /// Construtor ValidaInclusaoPoliticaCorretagem
        /// </summary>
		public ValidaInclusaoPoliticaCorretagem(){} 

		#endregion

		#region Métodos 

		public void Validate()
        {
            SinacorValidation validation = null;
            BusinessRulesValidator ruleValidator = null;

            if (base.EntityToValidate != null)
            {
                try
                {
                    //Validação de RulesSets
                    validation = new SinacorValidation();
                    validation.AddValidation<BusinessEntity.PoliticaCorretagem>(base.EntityToValidate);
                    validation.Validate();
                    
                    if (EntityToValidate.DataInicial.HasValue)
                    {
                        ResourceAccess.PoliticaCorretagem raPoliticaCorretagem = new ResourceAccess.PoliticaCorretagem();
                        if (raPoliticaCorretagem.ExisteOutraPoliticaComDataInicial(Convert.ToDateTime(base.EntityToValidate.DataInicial.Value.ToShortDateString())))
                        {
                            this.AddValidationError(PoliticaExistente);
                        }
                        else
                        {
                            ruleValidator = new BusinessRulesValidator();

                            //Validação de referências
                            ValidaReferenciasPoliticaCorretagem validaReferencias = new ValidaReferenciasPoliticaCorretagem();
                            validaReferencias.EntityToValidate = base.EntityToValidate;
                            ruleValidator.AddValidation("ValidaReferenciasPoliticaCorretagem", validaReferencias);
                            ruleValidator.Validate();
                        }
                    }

                    
                }
                catch (ValidationException ve)
                {
                    base.AddValidationError(ve.ValidationErrors);
                }
            }
            else
            {
                this.AddValidationError(ErroObjetoNulo);
            }
		}

        /// <summary>
        /// Retorna uma lista de Erros
        /// </summary>
        /// <returns></returns>
        public List<ValidationError> GetErrors()
        {
            return base.ErrorsList;
        }

		#endregion
	}
}